package org.ejb.entities;



import javax.persistence.*;
import java.io.Serializable;
//import java.util.Collection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Cette classe represente un Article
 * Le catalogue se divise en produits puis en articles.
 */

@SuppressWarnings("serial")
@Entity
public class Item implements Serializable {

    // ======================================
    // =             Attributs              =
    // ======================================
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private Float unitCost;
    private String description;
    private String imagePath; 
    private String console;
    private String genre;
    String typePaiement;

    int choice;

    public int getChoice() {
		return choice;
	}

	public void setChoice(int choice) {
		System.out.println("set "+this.getName() +"to choice "+choice);
		if (choice != 0)
			this.choice = choice;
	}

	public String getTypePaiement() {
		return typePaiement;
	}

	public void setTypePaiement(String typePaiement) {
		this.typePaiement = typePaiement;
	}

	public String getConsole() {
		return console;
	}

	public void setConsole(String console) {
		this.console = console;
	}

	public String getGenre() {
		return genre;
	}

	public void setGenre(String genre) {
		this.genre = genre;
	}
	/** La liste des commentaire sur l'Item */
	@OneToMany(mappedBy="item",fetch=FetchType.EAGER)
    private List<Evaluation> evals = new ArrayList<Evaluation>();
	
	/** La note moyenne de l'Item donnee par les internautes. */
//	@Transient
//	private Float evaluation;

	/** Le nombre d'articles vendus pour cet Item. */
	private Integer soldQuantity;
	
	/** Le nombre d'articles en stock */
	private Integer quantity;

	@ManyToOne
 	private Produit produit;
		
	private int prixLocation;
	
	private int prixAchat;
	
	/** ****************************/
	/** les attributs pour location*/
	private Double montant; // montant par jour

	public int getPrixLocation() {
		return prixLocation;
	}

	public void setPrixLocation(int prixLocation) {
		this.prixLocation = prixLocation;
	}

	public int getPrixAchat() {
		return prixAchat;
	}

	public void setPrixAchat(int prixAchat) {
		this.prixAchat = prixAchat;
	}
	private Date datePret;
	
	private Date dateRetour;
	
    // ======================================
    // =             Constantes             =
    // ======================================

    // ======================================
    // =            Constructeurs           =
    // ======================================
    public Item() {
    }

//    public Item(String name, Float unitCost) {
//        this.name = name;
//        this.unitCost = unitCost;
//    }
    
    public Item(String name){
    	this.name = name;
    }
    
//    public Item(String name, String description, String imagePath) {
//		this.name = name;
//		this.description = description;
//		this.imagePath = imagePath;
//	}
    
    public Item(String name, Float unitCost, String description, String imagePath, Integer quantity) {
		this.name = name;
        this.unitCost = unitCost;
		this.description = description;
		this.imagePath = imagePath;
		this.quantity = quantity;
		this.soldQuantity = 0;
	}
    
    public Item(String name, String description, String imagePath, Integer quantity,int pl, int pa) {
		this.name = name;
        this.unitCost = (float) pa;
		this.description = description;
		this.imagePath = imagePath;
		this.quantity = quantity;
		this.soldQuantity = 0;
		prixLocation = pl;
		prixAchat = pa;
	}
    
    public Item(String name, String description, String imagePath, Integer quantity,int pl, int pa,String g, String c) {
		this.name = name;
        this.unitCost = (float) pa;
		this.description = description;
		this.imagePath = imagePath;
		this.quantity = quantity;
		this.soldQuantity = 0;
		prixLocation = pl;
		prixAchat = pa;
		genre = g;
		console = c;
		typePaiement = "null";
	}
    
    // constructor pour l'item location
//	public Item (String name, Float uniCost, String description String imagePath, Integer quantity, Date datPret, Date datRetour, Double montant) {

//			//datePret = datePret;
    		//dateRetour = dateretour
//			this.montant = montant;
//	}


    // ======================================
 	// = Methodes Lifecycle Callback =
 	// ======================================
// 	@SuppressWarnings("unused")
// 	@PrePersist
// 	@PreUpdate
// 	private void validateData() {
// 		if (name == null || "".equals(name))
// 			throw new ValidationException("Invalid name");
// 		if (imagePath == null || "".equals(imagePath))
// 			throw new ValidationException("Invalid imagePath");
// 	}

 	/** Calcule la moyenne des notes donnees dans chaque commentaire relatif a cet
 	 * item. */
// 	public void calculateEvaluation() {
// 		Integer sum = 0, i = 0;
// 		for (Evaluation e : evals) {
// 			sum += e.getUserRate();
// 			i++;
// 		}
// 		if (i != 0)
// 			evaluation = new Float(sum / i);
// 	}

 	/** @param soldQuantity
 	 *  Le nombre d'articles recemment vendus. */
 	public void updateSoldQuantity(Integer soldQuantity) {
 		this.soldQuantity += soldQuantity;
 	}

    // ======================================
    // =          Methodes publiques        =
    // ======================================

    // ======================================
    // =          Methodes Protegees        =
    // ======================================

    // ======================================
    // =             Accesseurs             =
    // ======================================

    public Long getId() {
        return id;
    }
    public void setId(long id) {
    	this.id = id;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Float getUnitCost() {
        return unitCost;
    }
    public void setUnitCost(Float unitCost) {
        this.unitCost = unitCost;
    }

    public String getImagePath() {
        return imagePath;
    }
    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }
    
    public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}

	public Integer getQuantity() {
	    return quantity;
	    }
	public void setQuantity(Integer quantity) {
	    this.quantity = quantity;
	    }
	
	public List<Evaluation> getEvals() {
		return evals;
	}
	public void setEvals(List<Evaluation> evals) {
		this.evals = evals;
	}

//	public Float getEvaluation() {
//		return evaluation;
//	}
//	public void setEvaluation(Float evaluation) {
//		this.evaluation = evaluation;
//	}
	
	public Integer getSoldQuantity() {
		return soldQuantity;
	}
	public void setSoldQuantity(Integer soldQuantity) {
		this.soldQuantity = soldQuantity;
	}
	
	
//	/** @return a small description */
//	public String getSmallDescription() {
//		if (description.length() > 47)
//			return description.substring(0, 47);
//		return description;
//	}

	 public Produit getProduit() {
	     return produit;
	 }
	 public void setProduit(Produit produit) {
	     this.produit = produit;
	   	 this.produit.getItems().add(this);
	 }
	 
	 /** ********************/
	 /** Montant du location*/
	 public Double getMontant() {
			return montant;
		}
	public void setMontant(Double montant) {
			this.montant = montant;
		}
	
	/** date pret location */
	public Date getDatePret() {
		return datePret;
		}
	public void setDatePret(Date datePret) {
		this.datePret = datePret;
		}
	
	/** date retour location */
	public Date getDateRetour() {
		return dateRetour;
		}
	public void setDateRetour(Date dateRetour) {
		this.dateRetour = dateRetour;
		}
	
    // ======================================
    // =           Methodes Privees         =
    // ======================================

    // ======================================
    // =   Methodes hash, equals, toString  =
    // ======================================
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//
//        Item item = (Item) o;
//
//        if (!id.equals(item.id)) return false;
//        if (imagePath != null ? !imagePath.equals(item.imagePath) : item.imagePath != null) return false;
//        if (!name.equals(item.name)) return false;
//        if (!unitCost.equals(item.unitCost)) return false;
//
//        return true;
//    }

//    @Override
//    public int hashCode() {
//        int result;
//        result = id.hashCode();
//        result = 31 * result + name.hashCode();
//        result = 31 * result + unitCost.hashCode();
//        result = 31 * result + (imagePath != null ? imagePath.hashCode() : 0);
//        return result;
//    }

//    @Override
//    public String toString() {
//        final StringBuilder sb = new StringBuilder();
//        sb.append("Item");
//        sb.append("{id=").append(id);
//        sb.append(", name='").append(name).append('\'');
//        sb.append(", unitCost=").append(unitCost);
//        sb.append(", imagePath='").append(imagePath).append('\'');
//        sb.append(", product=").append(produit);
//        sb.append('}');
//        return sb.toString();
//    }
}